/* 
  本文件介绍创建rxjs Observable实例的方式
*/
// (() => {
// 	/* 观察者的三个方法(method)：

// 	next：每当Observable 发送出新的值，next 方法就会被呼叫。
	
// 	complete：在Observable 没有其他的资料可以取得时，complete 方法就会被呼叫，在complete 被呼叫之后，next 方法就不会再起作用。
	
// 	error：每当Observable 内发生错误时，error 方法就会被呼叫。 */
// 	let observable = Rx.Observable
// 	.create(function(observer) {
// 			observer.next('Jerry');
// 			observer.next('Anna');
// 			observer.complete();
// 			observer.next('not work');
// 	})
	
// // 宣告一個觀察者，具備 next, error, complete 三個方法
// 	let observer = {
// 		next: function(value) {
// 			console.log(value);
// 		},
// 		error: function(error) {
// 			console.log(error)
// 		},
// 		complete: function() {
// 			console.log('complete')
// 		}
// 	}

// // 用我們定義好的觀察者，來訂閱這個 observable	
// 	observable.subscribe(observer)
// // 上面的范例可以看得出来在complete 执行后，next 就会自动失效，所以没有印出not work。
// })()

// 下面则是送出错误的范例
(()=>{
    let observable = Rx.Observable
  .create(function(observer) {
    try {
      observer.next('Jerry');
      observer.next('Anna');
      throw 'some exception';
    } catch(e) {
      observer.error(e)
    }
  });
	
// 宣告一個觀察者，具備 next, error, complete 三個方法
let observer = {
	next: function(value) {
		console.log(value);
	},
	error: function(error) {
		console.log('Error: ', error)
	},
	complete: function() {
		console.log('complete')
	}
}
// 用我們定義好的觀察者，來訂閱這個 observable	
observable.subscribe(observer)
// 我们也可以直接把next, error, complete 三个function 依序传入observable.subscribe
// observable.subscribe(
//     value => { console.log(value); },
//     error => { console.log('Error: ', error); },
//     () => { console.log('complete') }
// )
})()

/*
    理解Marble diagrams
        每一个Observable实例都拥有一个Marble diagrams(弹珠图？)，表示当前实例在complete之前，的所有行为
        我们用 - 来表达一小段时间，这些 - 串起就代表一个observable。 
        ----------------
        X (大写X)则代表有错误发生 
        ---------------X
        | 则代表observable 结束
        ----------------|
        小括号代表着同步发生。
        (1234)|
        例如：
        var source = Rx.Observable.interval(1000);
        var newest = source.map(x => x + 1); 
        这时Marble diagrams 就会长像这样
        source: -----0-----1-----2-----3--...
            map(x => x + 1)
        newest: -----1-----2-----3-----4--...
    这个应该是学习rxjs需要重点理解的概念
*/

